前一天是以一個物件轉出轉入的效果
如果是改為每幾秒產生一個物件
就需要使用 陣列 記錄每一個 物件常值
var ary = [];
把 setInterval() 分三個部分執行
基本執行內容 => 產生物件常值 => 物件運算、判斷
setInterval(function(){
  // 基本執行內容
  // 跟前一篇的內容(除了運算以外)一樣
},10);
setInterval(function(){
  // 產生物件常值
},10);
setInterval(function(){
  // 物件運算、判斷
},1000);
setInterval(function(){
  ctx.clearRect(0, 0, 400, 400);
  for(var i=0; i < ary.length; i++){
    ctx.save();
    ctx.translate(200, 200);
    ctx.rotate(ary[i].angle *Math.PI/180);
    ctx.fillStyle = ary[i].color;
    ctx.fillRect(ary[i].radius, ary[i].radius, ary[i].item_size, ary[i].item_size);
    ctx.restore()
  }
},10)
為物件建立一個執行個體時,就可以使用物件常值標記法。
https://msdn.microsoft.com/zh-tw/library/202863ha(v=vs.94).aspx#Anchor_1
物件的角度、半徑、大小、顏色設定
setInterval(function(){
  var rect = {angle: 0, 
              radius: 100, 
              item_size: 10, 
              color:"rgb(" + getrandom() + ", " + getrandom() + ", " + getrandom() + ")"}
  ary.push(rect);  
}, 3000);
// 隨機數值
function getrandom(){
  return parseInt(Math.random()*255);
}
把每個陣列中的物件取出運算變更值、條件判斷之後執行或移出陣列
setInterval(function(){
  for(var i=0; i < ary.length; i++){
    // 當 radius < 5 時 移除這個物件
    if(ary[i].radius < 5 ){
      ary.splice(i,1);
    }
    ary[i].angle +=1;
    ary[i].radius -= 0.1;
    ary[i].item_size -= 0.01;
    }
  }
},10)
基本執行內容 => 產生物件常值 => 物件運算、判斷
這三個 setInterval() 執行的時間周期不同、效果也很不同
以下方的例子 秒數愈小跑愈快
setInterval(function(){ // 基本執行內容 },10);
setInterval(function(){ // 物件運算、判斷 },10);
setInterval(function(){ // 產生物件常值 },50);

setInterval(function(){ // 基本執行內容 },50);
setInterval(function(){ // 物件運算、判斷 },50);
setInterval(function(){ // 產生物件常值 },1000);

setInterval(function(){ // 基本執行內容 },500);
setInterval(function(){ // 物件運算、判斷 },50);
setInterval(function(){ // 產生物件常值 },500);

當 setInterval() 分多個依序執行時
要注意不可分太多
除了很有可能會出錯外
因為每執行一個就會佔掉一部分的記憶體
所以當 setInterval() 執行會變慢時
可以改用 "clearInterval 清除" 或者是 "setTimeout 時間到才執行一次" 解決佔掉太多記憶體的問題
var time = setInterval(function() { ... }, 1000);
clearInterval(time);